Set up

suppressPackageStartupMessages({
  library(tidyverse)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder -- this will be in the project root directory
# Use this as the root directory to ensure proper sourcing of functions 
# no matter where this is called from
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal")
results_dir <- file.path(analysis_dir, "results")
input_dir <- file.path(analysis_dir, "input")
files_dir <- file.path(root_dir, "analyses", "sample-distribution-analysis", "results")

# Input files for the paired longitudinal (PL) cohort
pbta_file <- file.path(files_dir, "pbta.tsv") # file from add-sample-distribution module
genomic_paired_file <- file.path(files_dir, "genomic_assays_matched_time_points.tsv")
tmb_vaf_file <- file.path(results_dir, "tmb_vaf_genomic.tsv")
palette_file <- file.path(root_dir, "figures", "palettes", "oncoprint_color_palette.tsv")


# Input files for the PBTA cohort
maf_file <- file.path(results_dir, "maf.tsv")
tmb_file <- file.path(input_dir, "snv-mutation-tmb-coding.tsv")


# File path to PL plot directory
PL_plots_dir <-
  file.path(analysis_dir, "plots", "Alteration_type_barplots_PL")
if (!dir.exists(PL_plots_dir)) {
  dir.create(PL_plots_dir)
}

# File path to kids_PL_plots directory
kids_PL_plots_dir <-
  file.path(PL_plots_dir, "kids_PL_plots")
if (!dir.exists(kids_PL_plots_dir)) {
  dir.create(kids_PL_plots_dir)
}

# File path to kids_molecular_subtype_PL_plots_dir directory
kids_molecular_subtype_PL_plots_dir <-
  file.path(PL_plots_dir, "kids_molecular_subtype_PL_plots")
if (!dir.exists(kids_molecular_subtype_PL_plots_dir)) {
  dir.create(kids_molecular_subtype_PL_plots_dir)
}


# File path to molecular_subtype_PL_plots directory
molecular_subtype_PL_plots_dir <-
  file.path(PL_plots_dir, "molecular_subtype_PL_plots")
if (!dir.exists(molecular_subtype_PL_plots_dir)) {
  dir.create(molecular_subtype_PL_plots_dir)
}

# File path to PBTA plot directory
PBTA_plots_dir <-
  file.path(analysis_dir, "plots", "Alteration_type_barplots_PBTA")
if (!dir.exists(PBTA_plots_dir)) {
  dir.create(PBTA_plots_dir)
}


# File path to molecular_subtype_PBTA_plots directory
molecular_subtype_PBTA_plots_dir <-
  file.path(PBTA_plots_dir, "molecular_subtype_PBTA_plots")
if (!dir.exists(molecular_subtype_PBTA_plots_dir)) {
  dir.create(molecular_subtype_PBTA_plots_dir)
}

source(paste0(root_dir, "/figures/scripts/theme.R"))
source(paste0(analysis_dir, "/util/function-create-barplot.R"))

Read in data and process

# Vector to order timepoints
timepoints_order <- c("Diagnosis", "Progressive", "Recurrence", "Deceased", "Second Malignancy", "Unavailable", "Metastatic", "Residual")
timepoints_order_abbrev <- c("Dx", "Pro", "Rec", "Dec", "SM", "Unavail", "Metastatic", "Residual")

# Vector to order Variant_Classification
variants_order <- c("Frame_Shift_Del", "Frame_Shift_Ins", "In_Frame_Del", 
                    "In_Frame_Ins", "Missense_Mutation", "Nonsense_Mutation", 
                    "Nonstop_Mutation", "Splice_Site", "Translation_Start_Site")

PL cohort

pbta_df <- readr::read_tsv(pbta_file, guess_max = 100000, show_col_types = FALSE) %>% 
  select(Kids_First_Participant_ID, Kids_First_Biospecimen_ID, cg_multiple, cg_id, cgGFAC, tumor_descriptor, molecular_subtype) %>%  #plot_group
  mutate(tumor_descriptor_abbrev = case_when(grepl("Diagnosis", tumor_descriptor) ~ "Dx",
                               grepl("Progressive", tumor_descriptor) ~ "Pro",
                               grepl("Recurrence", tumor_descriptor) ~ "Rec",
                               grepl("Deceased", tumor_descriptor) ~ "Dec",
                               grepl("Second Malignancy", tumor_descriptor) ~ "SM",
                               grepl("Unavailable", tumor_descriptor) ~ "Unavail",
                              TRUE ~ tumor_descriptor),
         molecular_subtype = str_replace(molecular_subtype, ",", ""),
         molecular_subtype_edited = str_replace(molecular_subtype, "^\\S* ", ""),
         
         # create unique identifier for timepoint and molecular subtype
         td_ms_plot_group = paste(tumor_descriptor_abbrev, molecular_subtype_edited, sep = ":")) 
  

# This includes non synonymous mutations as described in the `01-preporcess-data.Rmd`
tmb_vaf_df <- readr::read_tsv(tmb_vaf_file, guess_max = 100000, show_col_types = FALSE) %>% 
  filter(!tmb >= 10) %>% 
  select(Kids_First_Biospecimen_ID, Variant_Classification, gene_protein, mutation_count,   region_size, tmb, VAF) %>% 
  filter(!is.na(Variant_Classification))

# List with patients with paired longitudinal genomic specimens
genomic_paired_df <- readr::read_tsv(genomic_paired_file, guess_max = 100000, show_col_types = FALSE) %>%
  left_join(pbta_df, by = c("Kids_First_Participant_ID")) %>% 
  left_join(tmb_vaf_df, by = c("Kids_First_Biospecimen_ID")) %>%
  filter(!is.na(tmb))

# Number of patients with TMB information
no_samples_with_tmb <- print(length(unique(genomic_paired_df$Kids_First_Participant_ID)))
[1] 116
# Attention as some bs specimen might not have TMB.
# If that happens, we will end up with samples lacking timepoints.
# Let's identify these samples and remove them.
PL_df <- genomic_paired_df %>%
  select(Kids_First_Participant_ID, tumor_descriptor) %>% 
  unique() %>%
  arrange(Kids_First_Participant_ID, tumor_descriptor) %>%
  group_by(Kids_First_Participant_ID) %>%
  summarize(tumor_descriptor_sum = str_c(tumor_descriptor, collapse = ";")) %>%
  filter(!tumor_descriptor_sum %in% c("Diagnosis", "Progressive", "Recurrence", "Second Malignancy", "Unavailable", "Deceased", "Progressive;Progressive")) %>%
  left_join(genomic_paired_df, by = c("Kids_First_Participant_ID")) %>%
  filter(!cg_id == "NA",
         !tumor_descriptor == "Not Reported") %>% 
  mutate(match_id = paste(tumor_descriptor, Kids_First_Participant_ID, sep = "_"),
         cg_id = str_replace(cg_id, c("/|-"), " "))
  
# Let's summarize td_ms_plot_group and use this for visualization purposes
PL_td_ms_plot_group_n_df <- PL_df %>% 
  dplyr::count(cg_id, td_ms_plot_group) %>% 
  dplyr::mutate(td_ms_plot_group_n = glue::glue("{td_ms_plot_group} (N={n})")) %>% 
  dplyr::rename(td_ms_plot_group_number = n) 


# Let's summarize tumor_descriptor and use this for visualization purposes
PL_td_plot_group_n_df <- PL_df %>% 
  dplyr::count(cg_id, tumor_descriptor) %>% 
  dplyr::mutate(td_plot_group_n = glue::glue("{tumor_descriptor} (N={n})")) %>% 
  dplyr::rename(td_plot_group_number = n)

# Let's count number of samples 
PL_count_df <- PL_df %>%
  left_join(PL_td_ms_plot_group_n_df) %>%
  left_join(PL_td_plot_group_n_df) %>%
  filter(!is.na(Variant_Classification)) %>% 
  # remove if total #samples per timepoint is less than 2
  #filter(!td_ms_plot_group_number <= 2) %>% 
  group_by(tumor_descriptor, td_ms_plot_group, cg_id, molecular_subtype, Kids_First_Participant_ID, match_id, Variant_Classification, td_ms_plot_group_n, td_plot_group_n) %>% 
  dplyr::count(Kids_First_Participant_ID) %>% 
  mutate(tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, timepoints_order),
         Variant_Classification = factor(Variant_Classification),
         Variant_Classification = fct_relevel(Variant_Classification, variants_order)) %>% 
  arrange(cg_id, tumor_descriptor, td_plot_group_n, Variant_Classification, desc(molecular_subtype)) 
Joining with `by = join_by(cg_id, td_ms_plot_group)`Joining with `by = join_by(cg_id, tumor_descriptor)`Warning: There were 945 warnings in `mutate()`.
The first warning was:
ℹ In argument: `tumor_descriptor = fct_relevel(tumor_descriptor, timepoints_order)`.
ℹ In group 1: `tumor_descriptor = "Deceased"`, `td_ms_plot_group = "Dec:ADAM"`, `cg_id = "Adamantinomatous Craniopharyngioma"`, `molecular_subtype =
  "CRANIO ADAM"`, `Kids_First_Participant_ID = "PT_WYXTEG3E"`, `match_id = "Deceased_PT_WYXTEG3E"`, `Variant_Classification = "Frame_Shift_Del"`,
  `td_ms_plot_group_n = "Dec:ADAM (N=21)"`, `td_plot_group_n = "Deceased (N=21)"`.
Caused by warning:
! 3 unknown levels in `f`: Unavailable, Metastatic, and Residual
ℹ Run ]8;;ide:run:dplyr::last_dplyr_warnings()dplyr::last_dplyr_warnings()]8;; to see the 944 remaining warnings.
# Number of patients with TMB information and paired timepoints
no_samples <- print(length(unique(PL_count_df$Kids_First_Participant_ID)))
[1] 107

PBTA cohort

tmb_df <- readr::read_tsv(tmb_file, guess_max = 100000, show_col_types = FALSE) %>% 
  dplyr::rename(Kids_First_Biospecimen_ID = Tumor_Sample_Barcode) # change name of the biospecimen to match the one from the histologies files

tmb_vaf_df <- readr::read_tsv(maf_file, guess_max = 100000, show_col_types = FALSE) %>%
  left_join(tmb_df, by = c("Kids_First_Biospecimen_ID")) %>% 
  filter(!tmb >= 10,
         !is.na(tmb)) 

PBTA_df <- pbta_df %>% 
  left_join(tmb_vaf_df, by = c("Kids_First_Biospecimen_ID")) %>% 
  filter(!cg_id == "NA",
         !tumor_descriptor == "Not Reported",
         !is.na(Variant_Classification)) %>% 
  mutate(match_id = paste(tumor_descriptor, Kids_First_Participant_ID, sep = "_"),
         cg_id = str_replace(cg_id, c("/|-"), " "))

# Number of patients with TMB information
no_samples <- print(length(unique(PBTA_df$Kids_First_Participant_ID)))
[1] 1850
# Let's summarize tumor_descriptor and use this for visualization purposes
PBTA_td_plot_group_n_df <- PBTA_df %>% 
  dplyr::count(cg_id, tumor_descriptor) %>% 
  dplyr::mutate(td_plot_group_n = glue::glue("{tumor_descriptor} (N={n})")) %>% 
  dplyr::rename(td_plot_group_number = n)

# Let's count number of samples 
PBTA_count_df <- PBTA_df %>% 
  left_join(PBTA_td_plot_group_n_df, by = join_by("cg_id", "tumor_descriptor")) %>% 
  filter(!is.na(Variant_Classification)) %>% 
  group_by(tumor_descriptor, cg_id, molecular_subtype, Kids_First_Participant_ID, match_id, Variant_Classification, td_plot_group_n) %>% 
  dplyr::count(Kids_First_Participant_ID) %>% 
  mutate(tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, timepoints_order),
         Variant_Classification = factor(Variant_Classification),
         Variant_Classification = fct_relevel(Variant_Classification, variants_order)) %>% 
  arrange(cg_id, tumor_descriptor, td_plot_group_n, Variant_Classification, desc(molecular_subtype)) 
Warning: There were 6564 warnings in `mutate()`.
The first warning was:
ℹ In argument: `tumor_descriptor = fct_relevel(tumor_descriptor, timepoints_order)`.
ℹ In group 1: `tumor_descriptor = "Deceased"`, `cg_id = "Adamantinomatous Craniopharyngioma"`, `molecular_subtype = "CRANIO ADAM"`,
  `Kids_First_Participant_ID = "PT_WYXTEG3E"`, `match_id = "Deceased_PT_WYXTEG3E"`, `Variant_Classification = "Frame_Shift_Del"`, `td_plot_group_n =
  "Deceased (N=21)"`.
Caused by warning:
! 1 unknown level in `f`: Unavailable
ℹ Run ]8;;ide:run:dplyr::last_dplyr_warnings()dplyr::last_dplyr_warnings()]8;; to see the 6563 remaining warnings.

Define parameters for plots

# Read color palette
palette_df <- readr::read_tsv(palette_file, guess_max = 100000, show_col_types = FALSE) %>% 
  mutate(hex_codes = case_when(grepl("#000000", hex_codes) ~ "orange",
                               TRUE ~ hex_codes),
    color_names = factor(color_names),
         color_names = fct_relevel(color_names, variants_order)) %>% 
  arrange(color_names)

         
# Define and order palette
palette <- palette_df$hex_codes
names(palette) <- palette_df$color_names

Alterations per timepoint

PL cohort

# Define parameters for function
x_value <- PL_count_df$tumor_descriptor
title <- paste("Variant types in the paired longitudinal cohort", sep = " ")

# Run function
fname <- paste0(PL_plots_dir, "/", "Alteration_type_timepoints_barplots_PL.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/Alteration_type_timepoints_barplots_PL.pdf"
p <- create_stacked_barplot_variant(df = PL_count_df, x = x_value, palette = palette, title = title)
pdf(file = fname, width = 6, height = 6)
print(p)
dev.off()
quartz_off_screen 
                2 

PBTA cohort

# Define parameters for function
x_value <- PBTA_count_df$tumor_descriptor
title <- paste("Variant types in the PBTA cohort", sep = " ")

# Run function
fname <- paste0(PBTA_plots_dir, "/", "Alteration_type_timepoints_barplots_PBTA.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/Alteration_type_timepoints_barplots_PBTA.pdf"
p <- create_stacked_barplot_variant(df = PBTA_count_df, x = x_value, palette = palette, title = title)
pdf(file = fname, width = 6, height = 6)
print(p)
dev.off()
quartz_off_screen 
                2 

Alterations per timepoint in each cancer type

PL cohort

PL_panel_df <- PL_count_df %>% 
  mutate(cg_id = str_wrap(cg_id, 12)) # Edit to fit in the plot title for the panel

# Define parameters for function
x_value <- PL_panel_df$tumor_descriptor
title <- paste("Variant types across cancer groups in the paired longitudinal cohort", sep = " ")
rows <- 5

# Run function
fname <- paste0(PL_plots_dir, "/", "Alteration_type_timepoints_cg_id_barplots_PL.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/Alteration_type_timepoints_cg_id_barplots_PL.pdf"
p <- create_stacked_barplot_variant_cg_id(df = PL_panel_df, x = x_value, palette = palette, title = title, rows = rows)
pdf(file = fname, width = 12, height = 15)
print(p)
dev.off()
quartz_off_screen 
                2 

PBTA cohort

PBTA_panel_df <- PBTA_count_df %>% 
  mutate(cg_id = str_wrap(cg_id, 12)) # Edit to fit in the plot title for the panel

# Define parameters for function
x_value <- PBTA_panel_df$tumor_descriptor
title <- paste("Variant types across cancer groups in the PBTA cohort", sep = " ")
rows <- 10

# Run function
fname <- paste0(PBTA_plots_dir, "/", "Alteration_type_timepoints_cg_id_barplots_PBTA.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/Alteration_type_timepoints_cg_id_barplots_PBTA.pdf"
p <- create_stacked_barplot_variant_cg_id(df = PBTA_panel_df, x = x_value, palette = palette, title = title, rows = rows)
pdf(file = fname, width = 15, height = 28)
print(p)
dev.off()
quartz_off_screen 
                2 

Alterations per timepoint in each cancer type and molecular subtype

PL cohort

PL_panel_df <- PL_count_df %>% 
  mutate(cg_id = str_replace_all(cg_id, " ", "_"),
        # Edit to fit in the plot title for the panel
         molecular_subtype = str_wrap(molecular_subtype, 12)) 

sample <- as.character(unique(PL_panel_df$cg_id)) 
sample <- sort(sample, decreasing = FALSE)
sample
 [1] "Adamantinomatous_Craniopharyngioma"       "Atypical_Teratoid_Rhabdoid_Tumor"         "Chordoma"                                
 [4] "Choroid_plexus_carcinoma"                 "CNS_Embryonal_tumor"                      "Craniopharyngioma"                       
 [7] "Diffuse_midline_glioma"                   "Dysembryoplastic_neuroepithelial_tumor"   "Embryonal_tumor_with_multilayer_rosettes"
[10] "Ependymoma"                               "Ewing_sarcoma"                            "Ganglioglioma"                           
[13] "Glial_neuronal_tumor"                     "Hemangioblastoma"                         "High_grade_glioma"                       
[16] "Low_grade_glioma"                         "Malignant_peripheral_nerve_sheath_tumor"  "Medulloblastoma"                         
[19] "Meningioma"                               "Neuroblastoma"                            "Neurofibroma_Plexiform"                  
[22] "Pilocytic_astrocytoma"                    "Schwannoma"                              
# Loop through variable
for (i in seq_along(sample)){
  print(i)
  df_sub <- PL_panel_df %>%
    filter(cg_id == sample[i]) %>% 
    arrange(cg_id, desc(molecular_subtype), tumor_descriptor, td_plot_group_n, Variant_Classification) 

  if (i %in% c(10, 16)){
    width_value = 25
    }else{
    width_value = 10
    }
  
# Define parameters for function
x_value <- df_sub$tumor_descriptor
title <- paste(sample[i], "Variants across molecular subtypes", sep = ": ")
rows_value <- 1

# Run function
fname <- paste0(molecular_subtype_PL_plots_dir, "/", sample[i], "_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf")
print(fname)
p <- create_stacked_barplot_variant_molecular_subtype(df = df_sub, x = x_value, palette = palette, title = title, rows = rows_value)
pdf(file = fname, width = width_value, height = 6)
print(p)
dev.off()
}
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Adamantinomatous_Craniopharyngioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Atypical_Teratoid_Rhabdoid_Tumor_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Chordoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Choroid_plexus_carcinoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/CNS_Embryonal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Craniopharyngioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Diffuse_midline_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Dysembryoplastic_neuroepithelial_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Embryonal_tumor_with_multilayer_rosettes_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Ependymoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Ewing_sarcoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Ganglioglioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Glial_neuronal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Hemangioblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/High_grade_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Low_grade_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Malignant_peripheral_nerve_sheath_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Medulloblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Meningioma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Neuroblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Neurofibroma_Plexiform_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Pilocytic_astrocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/molecular_subtype_PL_plots/Schwannoma_Alteration_type_timepoints_molecular_subtype_barplots_PL.pdf"

PBTA cohort

PBTA_panel_df <- PBTA_count_df %>% 
  mutate(cg_id = str_replace_all(cg_id, " ", "_"),
         molecular_subtype = str_wrap(molecular_subtype, 12)) # Edit to fit in the plot title for the panel

sample <- as.character(unique(PBTA_panel_df$cg_id)) 
sample <- sort(sample, decreasing = FALSE)
sample
 [1] "Adamantinomatous_Craniopharyngioma"                   "Atypical_choroid_plexus_papilloma"                   
 [3] "Atypical_Teratoid_Rhabdoid_Tumor"                     "Cavernoma"                                           
 [5] "Central_neurocytoma"                                  "Chondromyxoid_fibroma"                               
 [7] "Chordoma"                                             "Choroid_plexus_carcinoma"                            
 [9] "Choroid_plexus_papilloma"                             "Choroid_plexus_tumor"                                
[11] "CNS_Burkitt's_lymphoma"                               "CNS_Embryonal_tumor"                                 
[13] "CNS_neuroblastoma"                                    "Craniopharyngioma"                                   
[15] "Desmoplastic_infantile_astrocytoma_and_ganglioglioma" "Diffuse_fibrillary_astrocytoma"                      
[17] "Diffuse_hemispheric_glioma"                           "Diffuse_intrinsic_pontine_glioma"                    
[19] "Diffuse_leptomeningeal_glioneuronal_tumor"            "Diffuse_midline_glioma"                              
[21] "Dysembryoplastic_neuroepithelial_tumor"               "Embryonal_tumor_with_multilayer_rosettes"            
[23] "Ependymoma"                                           "Epstein_Barr_virus-related_tumor"                    
[25] "Ewing_sarcoma"                                        "Extraventricular_neurocytoma"                        
[27] "Ganglioglioma"                                        "Ganglioneuroblastoma"                                
[29] "Ganglioneuroma"                                       "Germinoma"                                           
[31] "Glial_neuronal_tumor"                                 "Hemangioblastoma"                                    
[33] "High_grade_glioma"                                    "Histiocytic_tumor"                                   
[35] "Infant_type_hemispheric_glioma"                       "Inflammatory_Myofibroblastic_Tumor"                  
[37] "Langerhans_Cell_histiocytosis"                        "Low_grade_glioma"                                    
[39] "Malignant_peripheral_nerve_sheath_tumor"              "Medulloblastoma"                                     
[41] "Melanocytic_tumor"                                    "Meningioma"                                          
[43] "Mesenchymal_tumor"                                    "Metastatic_secondary_tumors"                         
[45] "Mixed_germ_cell_tumor"                                "Neuroblastoma"                                       
[47] "Neurofibroma_Plexiform"                               "Non_germinomatous_germ_cell_tumor"                   
[49] "Oligodendroglioma"                                    "Perineuroma"                                         
[51] "Pilocytic_astrocytoma"                                "Pineoblastoma"                                       
[53] "Pleomorphic_xanthoastrocytoma"                        "Rhabdomyosarcoma"                                    
[55] "Rosai_Dorfman_disease"                                "Rosette_forming_glioneuronal_tumor"                  
[57] "Sarcoma"                                              "Schwannoma"                                          
[59] "Subependymal_Giant_Cell_Astrocytoma"                  "Teratoma"                                            
# Loop through variable
for (i in seq_along(sample)){
  print(i)
  df_sub <- PBTA_panel_df %>%
    filter(cg_id == sample[i]) %>% 
    arrange(cg_id, desc(molecular_subtype), tumor_descriptor, td_plot_group_n, Variant_Classification) 

 
   if (i %in% c(23, 25, 41)){
    width_value = 25
    rows_value <- 1
    height_value = 6
   }else if (i %in% c(38)){
    width_value = 25
    rows_value <- 2
    height_value = 10
    }else{
    width_value = 10
    rows_value <- 1
    height_value = 6
    }
  
# Define parameters for function
x_value <- df_sub$tumor_descriptor
title <- paste(sample[i], "Variants across molecular subtypes", sep = ": ")


# Run function
fname <- paste0(molecular_subtype_PBTA_plots_dir, "/", sample[i], "_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf")
print(fname)
p <- create_stacked_barplot_variant_molecular_subtype(df = df_sub, x = x_value, palette = palette, title = title, rows = rows_value)
pdf(file = fname, width = width_value, height = height_value)
print(p)
dev.off()
}
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Adamantinomatous_Craniopharyngioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Atypical_choroid_plexus_papilloma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Atypical_Teratoid_Rhabdoid_Tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Cavernoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Central_neurocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Chondromyxoid_fibroma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Chordoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Choroid_plexus_carcinoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Choroid_plexus_papilloma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Choroid_plexus_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/CNS_Burkitt's_lymphoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/CNS_Embryonal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/CNS_neuroblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Craniopharyngioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Desmoplastic_infantile_astrocytoma_and_ganglioglioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Diffuse_fibrillary_astrocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Diffuse_hemispheric_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Diffuse_intrinsic_pontine_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Diffuse_leptomeningeal_glioneuronal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Diffuse_midline_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Dysembryoplastic_neuroepithelial_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Embryonal_tumor_with_multilayer_rosettes_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Ependymoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 24
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Epstein_Barr_virus-related_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 25
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Ewing_sarcoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 26
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Extraventricular_neurocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 27
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Ganglioglioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 28
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Ganglioneuroblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 29
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Ganglioneuroma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 30
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Germinoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 31
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Glial_neuronal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 32
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Hemangioblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 33
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/High_grade_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 34
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Histiocytic_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 35
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Infant_type_hemispheric_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 36
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Inflammatory_Myofibroblastic_Tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 37
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Langerhans_Cell_histiocytosis_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 38
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Low_grade_glioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 39
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Malignant_peripheral_nerve_sheath_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 40
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Medulloblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 41
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Melanocytic_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 42
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Meningioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 43
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Mesenchymal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 44
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Metastatic_secondary_tumors_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 45
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Mixed_germ_cell_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 46
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Neuroblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 47
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Neurofibroma_Plexiform_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 48
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Non_germinomatous_germ_cell_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 49
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Oligodendroglioma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 50
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Perineuroma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 51
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Pilocytic_astrocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 52
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Pineoblastoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 53
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Pleomorphic_xanthoastrocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 54
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Rhabdomyosarcoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 55
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Rosai_Dorfman_disease_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 56
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Rosette_forming_glioneuronal_tumor_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 57
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Sarcoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 58
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Schwannoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 59
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Subependymal_Giant_Cell_Astrocytoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"
[1] 60
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PBTA/molecular_subtype_PBTA_plots/Teratoma_Alteration_type_timepoints_molecular_subtype_barplots_PBTA.pdf"

Alterations per timepoint in each cancer type, molecular, and kids_id

PL cohort with molecular subtype

cg_df <- PL_count_df %>%
  # Fix syntax in cancer groups names 
  mutate(cg_id = str_replace_all(cg_id, " ", "_")) 

sample <- as.character(unique(cg_df$cg_id)) 
sample <- sort(sample, decreasing = FALSE)
sample
 [1] "Adamantinomatous_Craniopharyngioma"       "Atypical_Teratoid_Rhabdoid_Tumor"         "Chordoma"                                
 [4] "Choroid_plexus_carcinoma"                 "CNS_Embryonal_tumor"                      "Craniopharyngioma"                       
 [7] "Diffuse_midline_glioma"                   "Dysembryoplastic_neuroepithelial_tumor"   "Embryonal_tumor_with_multilayer_rosettes"
[10] "Ependymoma"                               "Ewing_sarcoma"                            "Ganglioglioma"                           
[13] "Glial_neuronal_tumor"                     "Hemangioblastoma"                         "High_grade_glioma"                       
[16] "Low_grade_glioma"                         "Malignant_peripheral_nerve_sheath_tumor"  "Medulloblastoma"                         
[19] "Meningioma"                               "Neuroblastoma"                            "Neurofibroma_Plexiform"                  
[22] "Pilocytic_astrocytoma"                    "Schwannoma"                              
# Loop through variable
for (i in seq_along(sample)){
  print(i)
  df_sub <- cg_df %>%
    filter(cg_id == sample[i]) %>%
     mutate(tumor_descriptor = factor(tumor_descriptor),
         tumor_descriptor = fct_relevel(tumor_descriptor, timepoints_order_abbrev),
         Variant_Classification = factor(Variant_Classification),
         Variant_Classification = fct_relevel(Variant_Classification, variants_order)) %>% 
    arrange(tumor_descriptor, Variant_Classification)

  if (i %in% c(2, 7, 15, 18)){
    width_value = 25
    }else if (i %in% c(10, 16)){
    width_value = 36
    }else{
    width_value = 10
      }

  # Define parameters for function
  x_value <- df_sub$td_ms_plot_group
  title <- paste(sample[i], "Variants across samples", sep = ": ")
  rows_value <- 1
  
  # Run function
  fname <- paste0(kids_molecular_subtype_PL_plots_dir, "/", sample[i], "_Alteration_type_timepoints_kids_barplots_PL.pdf")
  print(fname)
  p <- create_stacked_barplot_variant_kids(df = df_sub, x = x_value, palette = palette, title = title, rows = rows_value)
  pdf(file = fname, width = width_value, height = 6)
  print(p)
  dev.off()
  }
[1] 1
Warning: There were 42 warnings in `mutate()`.
The first warning was:
ℹ In argument: `tumor_descriptor = fct_relevel(tumor_descriptor, timepoints_order_abbrev)`.
ℹ In group 1: `tumor_descriptor = Diagnosis`, `td_ms_plot_group = "Dx:ADAM"`, `cg_id = "Adamantinomatous_Craniopharyngioma"`, `molecular_subtype = "CRANIO ADAM"`,
  `Kids_First_Participant_ID = "PT_CBTW4E3X"`, `match_id = "Diagnosis_PT_CBTW4E3X"`, `Variant_Classification = Missense_Mutation`, `td_ms_plot_group_n = "Dx:ADAM
  (N=27)"`, `td_plot_group_n = "Diagnosis (N=27)"`.
Caused by warning:
! 8 unknown levels in `f`: Dx, Pro, Rec, Dec, SM, Unavail, Metastatic, and Residual
ℹ Run ]8;;ide:run:dplyr::last_dplyr_warnings()dplyr::last_dplyr_warnings()]8;; to see the 41 remaining warnings.
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Adamantinomatous_Craniopharyngioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Atypical_Teratoid_Rhabdoid_Tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Chordoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Choroid_plexus_carcinoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/CNS_Embryonal_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Craniopharyngioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Diffuse_midline_glioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Dysembryoplastic_neuroepithelial_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Embryonal_tumor_with_multilayer_rosettes_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Ependymoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Ewing_sarcoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Ganglioglioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Glial_neuronal_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Hemangioblastoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/High_grade_glioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Low_grade_glioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Malignant_peripheral_nerve_sheath_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Medulloblastoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Meningioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Neuroblastoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Neurofibroma_Plexiform_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Pilocytic_astrocytoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_molecular_subtype_PL_plots/Schwannoma_Alteration_type_timepoints_kids_barplots_PL.pdf"

PL cohort without molecular subtype

cg_df <- PL_count_df %>%
  # Fix syntax in cancer groups names 
  mutate(cg_id = str_replace_all(cg_id, " ", "_"))

sample <- as.character(unique(cg_df$cg_id)) 
sample <- sort(sample, decreasing = FALSE)
sample
 [1] "Adamantinomatous_Craniopharyngioma"       "Atypical_Teratoid_Rhabdoid_Tumor"         "Chordoma"                                
 [4] "Choroid_plexus_carcinoma"                 "CNS_Embryonal_tumor"                      "Craniopharyngioma"                       
 [7] "Diffuse_midline_glioma"                   "Dysembryoplastic_neuroepithelial_tumor"   "Embryonal_tumor_with_multilayer_rosettes"
[10] "Ependymoma"                               "Ewing_sarcoma"                            "Ganglioglioma"                           
[13] "Glial_neuronal_tumor"                     "Hemangioblastoma"                         "High_grade_glioma"                       
[16] "Low_grade_glioma"                         "Malignant_peripheral_nerve_sheath_tumor"  "Medulloblastoma"                         
[19] "Meningioma"                               "Neuroblastoma"                            "Neurofibroma_Plexiform"                  
[22] "Pilocytic_astrocytoma"                    "Schwannoma"                              
# Loop through variable
for (i in seq_along(sample)){
  print(i)
  df_sub <- cg_df %>%
    filter(cg_id == sample[i]) 

  if (i %in% c(2, 7, 15, 18)){
    width_value = 25
    }else if (i %in% c(10, 16)){
    width_value = 28
    }else{
    width_value = 10
      }

  # Define parameters for function
  x_value <- df_sub$td_ms_plot_group_n
  title <- paste(sample[i], "Variants across samples", sep = ": ")
  rows <- 1
  
  # Run function
  fname <- paste0(kids_PL_plots_dir, "/", sample[i], "_Alteration_type_timepoints_kids_barplots_PL.pdf")
  print(fname)
  p <- create_stacked_barplot_variant_kids(df = df_sub, x = x_value, palette = palette, title = title, rows = rows)
  pdf(file = fname, width = width_value, height = 6)
  print(p)
  dev.off()
  }
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Adamantinomatous_Craniopharyngioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Atypical_Teratoid_Rhabdoid_Tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Chordoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Choroid_plexus_carcinoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/CNS_Embryonal_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Craniopharyngioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Diffuse_midline_glioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Dysembryoplastic_neuroepithelial_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Embryonal_tumor_with_multilayer_rosettes_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Ependymoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Ewing_sarcoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Ganglioglioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Glial_neuronal_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Hemangioblastoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/High_grade_glioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Low_grade_glioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Malignant_peripheral_nerve_sheath_tumor_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Medulloblastoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Meningioma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Neuroblastoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Neurofibroma_Plexiform_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Pilocytic_astrocytoma_Alteration_type_timepoints_kids_barplots_PL.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Alteration_type_barplots_PL/kids_PL_plots/Schwannoma_Alteration_type_timepoints_kids_barplots_PL.pdf"

LS0tCnRpdGxlOiAiQ2xhc3NpZmljYXRpb24gb2YgVmFyaWFudHMgaW4gdGhlIHBhaXJlZCBsb25naXR1ZGluYWwgKFBMKSBhbmQgUEJUQSBjb2hvcnRzIgphdXRob3I6ICdBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gZm9yIEQzQicKZGF0ZTogIjIwMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgojIFNldCB1cApgYGB7ciBsb2FkLWxpYnJhcnl9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeSh0aWR5dmVyc2UpCn0pCmBgYAoKIyBEaXJlY3RvcmllcyBhbmQgRmlsZSBJbnB1dHMvT3V0cHV0cwpgYGB7ciBzZXQtZGlyLWFuZC1maWxlLW5hbWVzfQojIERldGVjdCB0aGUgIi5naXQiIGZvbGRlciAtLSB0aGlzIHdpbGwgYmUgaW4gdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkKIyBVc2UgdGhpcyBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZW5zdXJlIHByb3BlciBzb3VyY2luZyBvZiBmdW5jdGlvbnMgCiMgbm8gbWF0dGVyIHdoZXJlIHRoaXMgaXMgY2FsbGVkIGZyb20Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCmFuYWx5c2lzX2RpciA8LSBmaWxlLnBhdGgocm9vdF9kaXIsICJhbmFseXNlcyIsICJ0bWItdmFmLWxvbmdpdHVkaW5hbCIpCnJlc3VsdHNfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJyZXN1bHRzIikKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCmZpbGVzX2RpciA8LSBmaWxlLnBhdGgocm9vdF9kaXIsICJhbmFseXNlcyIsICJzYW1wbGUtZGlzdHJpYnV0aW9uLWFuYWx5c2lzIiwgInJlc3VsdHMiKQoKIyBJbnB1dCBmaWxlcyBmb3IgdGhlIHBhaXJlZCBsb25naXR1ZGluYWwgKFBMKSBjb2hvcnQKcGJ0YV9maWxlIDwtIGZpbGUucGF0aChmaWxlc19kaXIsICJwYnRhLnRzdiIpICMgZmlsZSBmcm9tIGFkZC1zYW1wbGUtZGlzdHJpYnV0aW9uIG1vZHVsZQpnZW5vbWljX3BhaXJlZF9maWxlIDwtIGZpbGUucGF0aChmaWxlc19kaXIsICJnZW5vbWljX2Fzc2F5c19tYXRjaGVkX3RpbWVfcG9pbnRzLnRzdiIpCnRtYl92YWZfZmlsZSA8LSBmaWxlLnBhdGgocmVzdWx0c19kaXIsICJ0bWJfdmFmX2dlbm9taWMudHN2IikKcGFsZXR0ZV9maWxlIDwtIGZpbGUucGF0aChyb290X2RpciwgImZpZ3VyZXMiLCAicGFsZXR0ZXMiLCAib25jb3ByaW50X2NvbG9yX3BhbGV0dGUudHN2IikKCgojIElucHV0IGZpbGVzIGZvciB0aGUgUEJUQSBjb2hvcnQKbWFmX2ZpbGUgPC0gZmlsZS5wYXRoKHJlc3VsdHNfZGlyLCAibWFmLnRzdiIpCnRtYl9maWxlIDwtIGZpbGUucGF0aChpbnB1dF9kaXIsICJzbnYtbXV0YXRpb24tdG1iLWNvZGluZy50c3YiKQoKCiMgRmlsZSBwYXRoIHRvIFBMIHBsb3QgZGlyZWN0b3J5ClBMX3Bsb3RzX2RpciA8LQogIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJwbG90cyIsICJBbHRlcmF0aW9uX3R5cGVfYmFycGxvdHNfUEwiKQppZiAoIWRpci5leGlzdHMoUExfcGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUoUExfcGxvdHNfZGlyKQp9CgojIEZpbGUgcGF0aCB0byBraWRzX1BMX3Bsb3RzIGRpcmVjdG9yeQpraWRzX1BMX3Bsb3RzX2RpciA8LQogIGZpbGUucGF0aChQTF9wbG90c19kaXIsICJraWRzX1BMX3Bsb3RzIikKaWYgKCFkaXIuZXhpc3RzKGtpZHNfUExfcGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUoa2lkc19QTF9wbG90c19kaXIpCn0KCiMgRmlsZSBwYXRoIHRvIGtpZHNfbW9sZWN1bGFyX3N1YnR5cGVfUExfcGxvdHNfZGlyIGRpcmVjdG9yeQpraWRzX21vbGVjdWxhcl9zdWJ0eXBlX1BMX3Bsb3RzX2RpciA8LQogIGZpbGUucGF0aChQTF9wbG90c19kaXIsICJraWRzX21vbGVjdWxhcl9zdWJ0eXBlX1BMX3Bsb3RzIikKaWYgKCFkaXIuZXhpc3RzKGtpZHNfbW9sZWN1bGFyX3N1YnR5cGVfUExfcGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUoa2lkc19tb2xlY3VsYXJfc3VidHlwZV9QTF9wbG90c19kaXIpCn0KCgojIEZpbGUgcGF0aCB0byBtb2xlY3VsYXJfc3VidHlwZV9QTF9wbG90cyBkaXJlY3RvcnkKbW9sZWN1bGFyX3N1YnR5cGVfUExfcGxvdHNfZGlyIDwtCiAgZmlsZS5wYXRoKFBMX3Bsb3RzX2RpciwgIm1vbGVjdWxhcl9zdWJ0eXBlX1BMX3Bsb3RzIikKaWYgKCFkaXIuZXhpc3RzKG1vbGVjdWxhcl9zdWJ0eXBlX1BMX3Bsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKG1vbGVjdWxhcl9zdWJ0eXBlX1BMX3Bsb3RzX2RpcikKfQoKIyBGaWxlIHBhdGggdG8gUEJUQSBwbG90IGRpcmVjdG9yeQpQQlRBX3Bsb3RzX2RpciA8LQogIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJwbG90cyIsICJBbHRlcmF0aW9uX3R5cGVfYmFycGxvdHNfUEJUQSIpCmlmICghZGlyLmV4aXN0cyhQQlRBX3Bsb3RzX2RpcikpIHsKICBkaXIuY3JlYXRlKFBCVEFfcGxvdHNfZGlyKQp9CgoKIyBGaWxlIHBhdGggdG8gbW9sZWN1bGFyX3N1YnR5cGVfUEJUQV9wbG90cyBkaXJlY3RvcnkKbW9sZWN1bGFyX3N1YnR5cGVfUEJUQV9wbG90c19kaXIgPC0KICBmaWxlLnBhdGgoUEJUQV9wbG90c19kaXIsICJtb2xlY3VsYXJfc3VidHlwZV9QQlRBX3Bsb3RzIikKaWYgKCFkaXIuZXhpc3RzKG1vbGVjdWxhcl9zdWJ0eXBlX1BCVEFfcGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUobW9sZWN1bGFyX3N1YnR5cGVfUEJUQV9wbG90c19kaXIpCn0KCnNvdXJjZShwYXN0ZTAocm9vdF9kaXIsICIvZmlndXJlcy9zY3JpcHRzL3RoZW1lLlIiKSkKc291cmNlKHBhc3RlMChhbmFseXNpc19kaXIsICIvdXRpbC9mdW5jdGlvbi1jcmVhdGUtYmFycGxvdC5SIikpCmBgYAoKIyBSZWFkIGluIGRhdGEgYW5kIHByb2Nlc3MKCmBgYHtyIH0KIyBWZWN0b3IgdG8gb3JkZXIgdGltZXBvaW50cwp0aW1lcG9pbnRzX29yZGVyIDwtIGMoIkRpYWdub3NpcyIsICJQcm9ncmVzc2l2ZSIsICJSZWN1cnJlbmNlIiwgIkRlY2Vhc2VkIiwgIlNlY29uZCBNYWxpZ25hbmN5IiwgIlVuYXZhaWxhYmxlIiwgIk1ldGFzdGF0aWMiLCAiUmVzaWR1YWwiKQp0aW1lcG9pbnRzX29yZGVyX2FiYnJldiA8LSBjKCJEeCIsICJQcm8iLCAiUmVjIiwgIkRlYyIsICJTTSIsICJVbmF2YWlsIiwgIk1ldGFzdGF0aWMiLCAiUmVzaWR1YWwiKQoKIyBWZWN0b3IgdG8gb3JkZXIgVmFyaWFudF9DbGFzc2lmaWNhdGlvbgp2YXJpYW50c19vcmRlciA8LSBjKCJGcmFtZV9TaGlmdF9EZWwiLCAiRnJhbWVfU2hpZnRfSW5zIiwgIkluX0ZyYW1lX0RlbCIsIAogICAgICAgICAgICAgICAgICAgICJJbl9GcmFtZV9JbnMiLCAiTWlzc2Vuc2VfTXV0YXRpb24iLCAiTm9uc2Vuc2VfTXV0YXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAiTm9uc3RvcF9NdXRhdGlvbiIsICJTcGxpY2VfU2l0ZSIsICJUcmFuc2xhdGlvbl9TdGFydF9TaXRlIikKYGBgCiMjIFBMIGNvaG9ydAoKYGBge3IgbG9hZC1wcm9jZXNzLWlucHV0cy1QTH0KcGJ0YV9kZiA8LSByZWFkcjo6cmVhZF90c3YocGJ0YV9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAKICBzZWxlY3QoS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCwgY2dfbXVsdGlwbGUsIGNnX2lkLCBjZ0dGQUMsIHR1bW9yX2Rlc2NyaXB0b3IsIG1vbGVjdWxhcl9zdWJ0eXBlKSAlPiUgICNwbG90X2dyb3VwCiAgbXV0YXRlKHR1bW9yX2Rlc2NyaXB0b3JfYWJicmV2ID0gY2FzZV93aGVuKGdyZXBsKCJEaWFnbm9zaXMiLCB0dW1vcl9kZXNjcmlwdG9yKSB+ICJEeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiUHJvZ3Jlc3NpdmUiLCB0dW1vcl9kZXNjcmlwdG9yKSB+ICJQcm8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIlJlY3VycmVuY2UiLCB0dW1vcl9kZXNjcmlwdG9yKSB+ICJSZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoIkRlY2Vhc2VkIiwgdHVtb3JfZGVzY3JpcHRvcikgfiAiRGVjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJTZWNvbmQgTWFsaWduYW5jeSIsIHR1bW9yX2Rlc2NyaXB0b3IpIH4gIlNNIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJVbmF2YWlsYWJsZSIsIHR1bW9yX2Rlc2NyaXB0b3IpIH4gIlVuYXZhaWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gdHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIG1vbGVjdWxhcl9zdWJ0eXBlID0gc3RyX3JlcGxhY2UobW9sZWN1bGFyX3N1YnR5cGUsICIsIiwgIiIpLAogICAgICAgICBtb2xlY3VsYXJfc3VidHlwZV9lZGl0ZWQgPSBzdHJfcmVwbGFjZShtb2xlY3VsYXJfc3VidHlwZSwgIl5cXFMqICIsICIiKSwKICAgICAgICAgCiAgICAgICAgICMgY3JlYXRlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aW1lcG9pbnQgYW5kIG1vbGVjdWxhciBzdWJ0eXBlCiAgICAgICAgIHRkX21zX3Bsb3RfZ3JvdXAgPSBwYXN0ZSh0dW1vcl9kZXNjcmlwdG9yX2FiYnJldiwgbW9sZWN1bGFyX3N1YnR5cGVfZWRpdGVkLCBzZXAgPSAiOiIpKSAKICAKCiMgVGhpcyBpbmNsdWRlcyBub24gc3lub255bW91cyBtdXRhdGlvbnMgYXMgZGVzY3JpYmVkIGluIHRoZSBgMDEtcHJlcG9yY2Vzcy1kYXRhLlJtZGAKdG1iX3ZhZl9kZiA8LSByZWFkcjo6cmVhZF90c3YodG1iX3ZhZl9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JSAKICBmaWx0ZXIoIXRtYiA+PSAxMCkgJT4lIAogIHNlbGVjdChLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lELCBWYXJpYW50X0NsYXNzaWZpY2F0aW9uLCBnZW5lX3Byb3RlaW4sIG11dGF0aW9uX2NvdW50LAlyZWdpb25fc2l6ZSwgdG1iLCBWQUYpICU+JSAKICBmaWx0ZXIoIWlzLm5hKFZhcmlhbnRfQ2xhc3NpZmljYXRpb24pKQoKIyBMaXN0IHdpdGggcGF0aWVudHMgd2l0aCBwYWlyZWQgbG9uZ2l0dWRpbmFsIGdlbm9taWMgc3BlY2ltZW5zCmdlbm9taWNfcGFpcmVkX2RmIDwtIHJlYWRyOjpyZWFkX3RzdihnZW5vbWljX3BhaXJlZF9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpICU+JQogIGxlZnRfam9pbihwYnRhX2RmLCBieSA9IGMoIktpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQiKSkgJT4lIAogIGxlZnRfam9pbih0bWJfdmFmX2RmLCBieSA9IGMoIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh0bWIpKQoKIyBOdW1iZXIgb2YgcGF0aWVudHMgd2l0aCBUTUIgaW5mb3JtYXRpb24Kbm9fc2FtcGxlc193aXRoX3RtYiA8LSBwcmludChsZW5ndGgodW5pcXVlKGdlbm9taWNfcGFpcmVkX2RmJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSkKCiMgQXR0ZW50aW9uIGFzIHNvbWUgYnMgc3BlY2ltZW4gbWlnaHQgbm90IGhhdmUgVE1CLgojIElmIHRoYXQgaGFwcGVucywgd2Ugd2lsbCBlbmQgdXAgd2l0aCBzYW1wbGVzIGxhY2tpbmcgdGltZXBvaW50cy4KIyBMZXQncyBpZGVudGlmeSB0aGVzZSBzYW1wbGVzIGFuZCByZW1vdmUgdGhlbS4KUExfZGYgPC0gZ2Vub21pY19wYWlyZWRfZGYgJT4lCiAgc2VsZWN0KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHR1bW9yX2Rlc2NyaXB0b3IpICU+JSAKICB1bmlxdWUoKSAlPiUKICBhcnJhbmdlKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHR1bW9yX2Rlc2NyaXB0b3IpICU+JQogIGdyb3VwX2J5KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpICU+JQogIHN1bW1hcml6ZSh0dW1vcl9kZXNjcmlwdG9yX3N1bSA9IHN0cl9jKHR1bW9yX2Rlc2NyaXB0b3IsIGNvbGxhcHNlID0gIjsiKSkgJT4lCiAgZmlsdGVyKCF0dW1vcl9kZXNjcmlwdG9yX3N1bSAlaW4lIGMoIkRpYWdub3NpcyIsICJQcm9ncmVzc2l2ZSIsICJSZWN1cnJlbmNlIiwgIlNlY29uZCBNYWxpZ25hbmN5IiwgIlVuYXZhaWxhYmxlIiwgIkRlY2Vhc2VkIiwgIlByb2dyZXNzaXZlO1Byb2dyZXNzaXZlIikpICU+JQogIGxlZnRfam9pbihnZW5vbWljX3BhaXJlZF9kZiwgYnkgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIikpICU+JQogIGZpbHRlcighY2dfaWQgPT0gIk5BIiwKICAgICAgICAgIXR1bW9yX2Rlc2NyaXB0b3IgPT0gIk5vdCBSZXBvcnRlZCIpICU+JSAKICBtdXRhdGUobWF0Y2hfaWQgPSBwYXN0ZSh0dW1vcl9kZXNjcmlwdG9yLCBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCBzZXAgPSAiXyIpLAogICAgICAgICBjZ19pZCA9IHN0cl9yZXBsYWNlKGNnX2lkLCBjKCIvfC0iKSwgIiAiKSkKICAKIyBMZXQncyBzdW1tYXJpemUgdGRfbXNfcGxvdF9ncm91cCBhbmQgdXNlIHRoaXMgZm9yIHZpc3VhbGl6YXRpb24gcHVycG9zZXMKUExfdGRfbXNfcGxvdF9ncm91cF9uX2RmIDwtIFBMX2RmICU+JSAKICBkcGx5cjo6Y291bnQoY2dfaWQsIHRkX21zX3Bsb3RfZ3JvdXApICU+JSAKICBkcGx5cjo6bXV0YXRlKHRkX21zX3Bsb3RfZ3JvdXBfbiA9IGdsdWU6OmdsdWUoInt0ZF9tc19wbG90X2dyb3VwfSAoTj17bn0pIikpICU+JSAKICBkcGx5cjo6cmVuYW1lKHRkX21zX3Bsb3RfZ3JvdXBfbnVtYmVyID0gbikgCgoKIyBMZXQncyBzdW1tYXJpemUgdHVtb3JfZGVzY3JpcHRvciBhbmQgdXNlIHRoaXMgZm9yIHZpc3VhbGl6YXRpb24gcHVycG9zZXMKUExfdGRfcGxvdF9ncm91cF9uX2RmIDwtIFBMX2RmICU+JSAKICBkcGx5cjo6Y291bnQoY2dfaWQsIHR1bW9yX2Rlc2NyaXB0b3IpICU+JSAKICBkcGx5cjo6bXV0YXRlKHRkX3Bsb3RfZ3JvdXBfbiA9IGdsdWU6OmdsdWUoInt0dW1vcl9kZXNjcmlwdG9yfSAoTj17bn0pIikpICU+JSAKICBkcGx5cjo6cmVuYW1lKHRkX3Bsb3RfZ3JvdXBfbnVtYmVyID0gbikKCiMgTGV0J3MgY291bnQgbnVtYmVyIG9mIHNhbXBsZXMgClBMX2NvdW50X2RmIDwtIFBMX2RmICU+JQogIGxlZnRfam9pbihQTF90ZF9tc19wbG90X2dyb3VwX25fZGYpICU+JQogIGxlZnRfam9pbihQTF90ZF9wbG90X2dyb3VwX25fZGYpICU+JQogIGZpbHRlcighaXMubmEoVmFyaWFudF9DbGFzc2lmaWNhdGlvbikpICU+JSAKICAjIHJlbW92ZSBpZiB0b3RhbCAjc2FtcGxlcyBwZXIgdGltZXBvaW50IGlzIGxlc3MgdGhhbiAyCiAgI2ZpbHRlcighdGRfbXNfcGxvdF9ncm91cF9udW1iZXIgPD0gMikgJT4lIAogIGdyb3VwX2J5KHR1bW9yX2Rlc2NyaXB0b3IsIHRkX21zX3Bsb3RfZ3JvdXAsIGNnX2lkLCBtb2xlY3VsYXJfc3VidHlwZSwgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgbWF0Y2hfaWQsIFZhcmlhbnRfQ2xhc3NpZmljYXRpb24sIHRkX21zX3Bsb3RfZ3JvdXBfbiwgdGRfcGxvdF9ncm91cF9uKSAlPiUgCiAgZHBseXI6OmNvdW50KEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpICU+JSAKICBtdXRhdGUodHVtb3JfZGVzY3JpcHRvciA9IGZhY3Rvcih0dW1vcl9kZXNjcmlwdG9yKSwKICAgICAgICAgdHVtb3JfZGVzY3JpcHRvciA9IGZjdF9yZWxldmVsKHR1bW9yX2Rlc2NyaXB0b3IsIHRpbWVwb2ludHNfb3JkZXIpLAogICAgICAgICBWYXJpYW50X0NsYXNzaWZpY2F0aW9uID0gZmFjdG9yKFZhcmlhbnRfQ2xhc3NpZmljYXRpb24pLAogICAgICAgICBWYXJpYW50X0NsYXNzaWZpY2F0aW9uID0gZmN0X3JlbGV2ZWwoVmFyaWFudF9DbGFzc2lmaWNhdGlvbiwgdmFyaWFudHNfb3JkZXIpKSAlPiUgCiAgYXJyYW5nZShjZ19pZCwgdHVtb3JfZGVzY3JpcHRvciwgdGRfcGxvdF9ncm91cF9uLCBWYXJpYW50X0NsYXNzaWZpY2F0aW9uLCBkZXNjKG1vbGVjdWxhcl9zdWJ0eXBlKSkgCgojIE51bWJlciBvZiBwYXRpZW50cyB3aXRoIFRNQiBpbmZvcm1hdGlvbiBhbmQgcGFpcmVkIHRpbWVwb2ludHMKbm9fc2FtcGxlcyA8LSBwcmludChsZW5ndGgodW5pcXVlKFBMX2NvdW50X2RmJEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQpKSkKCmBgYCAKCiMjIFBCVEEgY29ob3J0CgpgYGB7ciBsb2FkLXByb2Nlc3MtaW5wdXRzLVBCVEF9CnRtYl9kZiA8LSByZWFkcjo6cmVhZF90c3YodG1iX2ZpbGUsIGd1ZXNzX21heCA9IDEwMDAwMCwgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkgJT4lIAogIGRwbHlyOjpyZW5hbWUoS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRCA9IFR1bW9yX1NhbXBsZV9CYXJjb2RlKSAjIGNoYW5nZSBuYW1lIG9mIHRoZSBiaW9zcGVjaW1lbiB0byBtYXRjaCB0aGUgb25lIGZyb20gdGhlIGhpc3RvbG9naWVzIGZpbGVzCgp0bWJfdmFmX2RmIDwtIHJlYWRyOjpyZWFkX3RzdihtYWZfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAlPiUKICBsZWZ0X2pvaW4odG1iX2RmLCBieSA9IGMoIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSkgJT4lIAogIGZpbHRlcighdG1iID49IDEwLAogICAgICAgICAhaXMubmEodG1iKSkgCgpQQlRBX2RmIDwtIHBidGFfZGYgJT4lIAogIGxlZnRfam9pbih0bWJfdmFmX2RmLCBieSA9IGMoIktpZHNfRmlyc3RfQmlvc3BlY2ltZW5fSUQiKSkgJT4lIAogIGZpbHRlcighY2dfaWQgPT0gIk5BIiwKICAgICAgICAgIXR1bW9yX2Rlc2NyaXB0b3IgPT0gIk5vdCBSZXBvcnRlZCIsCiAgICAgICAgICFpcy5uYShWYXJpYW50X0NsYXNzaWZpY2F0aW9uKSkgJT4lIAogIG11dGF0ZShtYXRjaF9pZCA9IHBhc3RlKHR1bW9yX2Rlc2NyaXB0b3IsIEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQsIHNlcCA9ICJfIiksCiAgICAgICAgIGNnX2lkID0gc3RyX3JlcGxhY2UoY2dfaWQsIGMoIi98LSIpLCAiICIpKQoKIyBOdW1iZXIgb2YgcGF0aWVudHMgd2l0aCBUTUIgaW5mb3JtYXRpb24Kbm9fc2FtcGxlcyA8LSBwcmludChsZW5ndGgodW5pcXVlKFBCVEFfZGYkS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCkpKQoKCiMgTGV0J3Mgc3VtbWFyaXplIHR1bW9yX2Rlc2NyaXB0b3IgYW5kIHVzZSB0aGlzIGZvciB2aXN1YWxpemF0aW9uIHB1cnBvc2VzClBCVEFfdGRfcGxvdF9ncm91cF9uX2RmIDwtIFBCVEFfZGYgJT4lIAogIGRwbHlyOjpjb3VudChjZ19pZCwgdHVtb3JfZGVzY3JpcHRvcikgJT4lIAogIGRwbHlyOjptdXRhdGUodGRfcGxvdF9ncm91cF9uID0gZ2x1ZTo6Z2x1ZSgie3R1bW9yX2Rlc2NyaXB0b3J9IChOPXtufSkiKSkgJT4lIAogIGRwbHlyOjpyZW5hbWUodGRfcGxvdF9ncm91cF9udW1iZXIgPSBuKQoKIyBMZXQncyBjb3VudCBudW1iZXIgb2Ygc2FtcGxlcyAKUEJUQV9jb3VudF9kZiA8LSBQQlRBX2RmICU+JSAKICBsZWZ0X2pvaW4oUEJUQV90ZF9wbG90X2dyb3VwX25fZGYsIGJ5ID0gam9pbl9ieSgiY2dfaWQiLCAidHVtb3JfZGVzY3JpcHRvciIpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShWYXJpYW50X0NsYXNzaWZpY2F0aW9uKSkgJT4lIAogIGdyb3VwX2J5KHR1bW9yX2Rlc2NyaXB0b3IsIGNnX2lkLCBtb2xlY3VsYXJfc3VidHlwZSwgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRCwgbWF0Y2hfaWQsIFZhcmlhbnRfQ2xhc3NpZmljYXRpb24sIHRkX3Bsb3RfZ3JvdXBfbikgJT4lIAogIGRwbHlyOjpjb3VudChLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSAlPiUgCiAgbXV0YXRlKHR1bW9yX2Rlc2NyaXB0b3IgPSBmYWN0b3IodHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmY3RfcmVsZXZlbCh0dW1vcl9kZXNjcmlwdG9yLCB0aW1lcG9pbnRzX29yZGVyKSwKICAgICAgICAgVmFyaWFudF9DbGFzc2lmaWNhdGlvbiA9IGZhY3RvcihWYXJpYW50X0NsYXNzaWZpY2F0aW9uKSwKICAgICAgICAgVmFyaWFudF9DbGFzc2lmaWNhdGlvbiA9IGZjdF9yZWxldmVsKFZhcmlhbnRfQ2xhc3NpZmljYXRpb24sIHZhcmlhbnRzX29yZGVyKSkgJT4lIAogIGFycmFuZ2UoY2dfaWQsIHR1bW9yX2Rlc2NyaXB0b3IsIHRkX3Bsb3RfZ3JvdXBfbiwgVmFyaWFudF9DbGFzc2lmaWNhdGlvbiwgZGVzYyhtb2xlY3VsYXJfc3VidHlwZSkpIAoKYGBgCgoKCiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIHBsb3RzCgpgYGB7ciBkZWZpbmUtcGFyYW1ldGVycy1mb3ItcGxvdHN9CiMgUmVhZCBjb2xvciBwYWxldHRlCnBhbGV0dGVfZGYgPC0gcmVhZHI6OnJlYWRfdHN2KHBhbGV0dGVfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKSAlPiUgCiAgbXV0YXRlKGhleF9jb2RlcyA9IGNhc2Vfd2hlbihncmVwbCgiIzAwMDAwMCIsIGhleF9jb2RlcykgfiAib3JhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBoZXhfY29kZXMpLAogICAgY29sb3JfbmFtZXMgPSBmYWN0b3IoY29sb3JfbmFtZXMpLAogICAgICAgICBjb2xvcl9uYW1lcyA9IGZjdF9yZWxldmVsKGNvbG9yX25hbWVzLCB2YXJpYW50c19vcmRlcikpICU+JSAKICBhcnJhbmdlKGNvbG9yX25hbWVzKQoKICAgICAgICAgCiMgRGVmaW5lIGFuZCBvcmRlciBwYWxldHRlCnBhbGV0dGUgPC0gcGFsZXR0ZV9kZiRoZXhfY29kZXMKbmFtZXMocGFsZXR0ZSkgPC0gcGFsZXR0ZV9kZiRjb2xvcl9uYW1lcwpgYGAKCiMgQWx0ZXJhdGlvbnMgcGVyIHRpbWVwb2ludAoKIyMgUEwgY29ob3J0CgpgYGB7ciBwbG90LXRpbWVwb2ludC1QTCwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp4X3ZhbHVlIDwtIFBMX2NvdW50X2RmJHR1bW9yX2Rlc2NyaXB0b3IKdGl0bGUgPC0gcGFzdGUoIlZhcmlhbnQgdHlwZXMgaW4gdGhlIHBhaXJlZCBsb25naXR1ZGluYWwgY29ob3J0Iiwgc2VwID0gIiAiKQoKIyBSdW4gZnVuY3Rpb24KZm5hbWUgPC0gcGFzdGUwKFBMX3Bsb3RzX2RpciwgIi8iLCAiQWx0ZXJhdGlvbl90eXBlX3RpbWVwb2ludHNfYmFycGxvdHNfUEwucGRmIikKcHJpbnQoZm5hbWUpCnAgPC0gY3JlYXRlX3N0YWNrZWRfYmFycGxvdF92YXJpYW50KGRmID0gUExfY291bnRfZGYsIHggPSB4X3ZhbHVlLCBwYWxldHRlID0gcGFsZXR0ZSwgdGl0bGUgPSB0aXRsZSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSA2LCBoZWlnaHQgPSA2KQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIyBQQlRBIGNvaG9ydAoKYGBge3IgcGxvdC10aW1lcG9pbnQtUEJUQSwgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp4X3ZhbHVlIDwtIFBCVEFfY291bnRfZGYkdHVtb3JfZGVzY3JpcHRvcgp0aXRsZSA8LSBwYXN0ZSgiVmFyaWFudCB0eXBlcyBpbiB0aGUgUEJUQSBjb2hvcnQiLCBzZXAgPSAiICIpCgojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAoUEJUQV9wbG90c19kaXIsICIvIiwgIkFsdGVyYXRpb25fdHlwZV90aW1lcG9pbnRzX2JhcnBsb3RzX1BCVEEucGRmIikKcHJpbnQoZm5hbWUpCnAgPC0gY3JlYXRlX3N0YWNrZWRfYmFycGxvdF92YXJpYW50KGRmID0gUEJUQV9jb3VudF9kZiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlKQpwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IDYsIGhlaWdodCA9IDYpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCgojIEFsdGVyYXRpb25zIHBlciB0aW1lcG9pbnQgaW4gZWFjaCBjYW5jZXIgdHlwZQoKIyMgUEwgY29ob3J0CgpgYGB7ciBwbG90LWNnLWlkLVBMLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDE1LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KUExfcGFuZWxfZGYgPC0gUExfY291bnRfZGYgJT4lIAogIG11dGF0ZShjZ19pZCA9IHN0cl93cmFwKGNnX2lkLCAxMikpICMgRWRpdCB0byBmaXQgaW4gdGhlIHBsb3QgdGl0bGUgZm9yIHRoZSBwYW5lbAoKIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KeF92YWx1ZSA8LSBQTF9wYW5lbF9kZiR0dW1vcl9kZXNjcmlwdG9yCnRpdGxlIDwtIHBhc3RlKCJWYXJpYW50IHR5cGVzIGFjcm9zcyBjYW5jZXIgZ3JvdXBzIGluIHRoZSBwYWlyZWQgbG9uZ2l0dWRpbmFsIGNvaG9ydCIsIHNlcCA9ICIgIikKcm93cyA8LSA1CgojIFJ1biBmdW5jdGlvbgpmbmFtZSA8LSBwYXN0ZTAoUExfcGxvdHNfZGlyLCAiLyIsICJBbHRlcmF0aW9uX3R5cGVfdGltZXBvaW50c19jZ19pZF9iYXJwbG90c19QTC5wZGYiKQpwcmludChmbmFtZSkKcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90X3ZhcmlhbnRfY2dfaWQoZGYgPSBQTF9wYW5lbF9kZiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlLCByb3dzID0gcm93cykKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gMTUpCnByaW50KHApCmRldi5vZmYoKQpgYGAKCiMjIFBCVEEgY29ob3J0CgoKYGBge3IgcGxvdC1jZy1pZC1QQlRBLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDI4LCBmaWcuZnVsbHdpZHRoID0gVFJVRX0KUEJUQV9wYW5lbF9kZiA8LSBQQlRBX2NvdW50X2RmICU+JSAKICBtdXRhdGUoY2dfaWQgPSBzdHJfd3JhcChjZ19pZCwgMTIpKSAjIEVkaXQgdG8gZml0IGluIHRoZSBwbG90IHRpdGxlIGZvciB0aGUgcGFuZWwKCiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCnhfdmFsdWUgPC0gUEJUQV9wYW5lbF9kZiR0dW1vcl9kZXNjcmlwdG9yCnRpdGxlIDwtIHBhc3RlKCJWYXJpYW50IHR5cGVzIGFjcm9zcyBjYW5jZXIgZ3JvdXBzIGluIHRoZSBQQlRBIGNvaG9ydCIsIHNlcCA9ICIgIikKcm93cyA8LSAxMAoKIyBSdW4gZnVuY3Rpb24KZm5hbWUgPC0gcGFzdGUwKFBCVEFfcGxvdHNfZGlyLCAiLyIsICJBbHRlcmF0aW9uX3R5cGVfdGltZXBvaW50c19jZ19pZF9iYXJwbG90c19QQlRBLnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3RfdmFyaWFudF9jZ19pZChkZiA9IFBCVEFfcGFuZWxfZGYsIHggPSB4X3ZhbHVlLCBwYWxldHRlID0gcGFsZXR0ZSwgdGl0bGUgPSB0aXRsZSwgcm93cyA9IHJvd3MpCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTUsIGhlaWdodCA9IDI4KQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgoKIyBBbHRlcmF0aW9ucyBwZXIgdGltZXBvaW50IGluIGVhY2ggY2FuY2VyIHR5cGUgYW5kIG1vbGVjdWxhciBzdWJ0eXBlCgojIyBQTCBjb2hvcnQKCmBgYHtyIHBsb3QtbW9sZWN1bGFyLXN1YnR5cGUtUEwsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9ClBMX3BhbmVsX2RmIDwtIFBMX2NvdW50X2RmICU+JSAKICBtdXRhdGUoY2dfaWQgPSBzdHJfcmVwbGFjZV9hbGwoY2dfaWQsICIgIiwgIl8iKSwKICAgICAgICAjIEVkaXQgdG8gZml0IGluIHRoZSBwbG90IHRpdGxlIGZvciB0aGUgcGFuZWwKICAgICAgICAgbW9sZWN1bGFyX3N1YnR5cGUgPSBzdHJfd3JhcChtb2xlY3VsYXJfc3VidHlwZSwgMTIpKSAKCnNhbXBsZSA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKFBMX3BhbmVsX2RmJGNnX2lkKSkgCnNhbXBsZSA8LSBzb3J0KHNhbXBsZSwgZGVjcmVhc2luZyA9IEZBTFNFKQpzYW1wbGUKCgojIExvb3AgdGhyb3VnaCB2YXJpYWJsZQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNhbXBsZSkpewogIHByaW50KGkpCiAgZGZfc3ViIDwtIFBMX3BhbmVsX2RmICU+JQogICAgZmlsdGVyKGNnX2lkID09IHNhbXBsZVtpXSkgJT4lIAogICAgYXJyYW5nZShjZ19pZCwgZGVzYyhtb2xlY3VsYXJfc3VidHlwZSksIHR1bW9yX2Rlc2NyaXB0b3IsIHRkX3Bsb3RfZ3JvdXBfbiwgVmFyaWFudF9DbGFzc2lmaWNhdGlvbikgCgogIGlmIChpICVpbiUgYygxMCwgMTYpKXsKICAgIHdpZHRoX3ZhbHVlID0gMjUKICAgIH1lbHNlewogICAgd2lkdGhfdmFsdWUgPSAxMAogICAgfQogIAojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp4X3ZhbHVlIDwtIGRmX3N1YiR0dW1vcl9kZXNjcmlwdG9yCnRpdGxlIDwtIHBhc3RlKHNhbXBsZVtpXSwgIlZhcmlhbnRzIGFjcm9zcyBtb2xlY3VsYXIgc3VidHlwZXMiLCBzZXAgPSAiOiAiKQpyb3dzX3ZhbHVlIDwtIDEKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChtb2xlY3VsYXJfc3VidHlwZV9QTF9wbG90c19kaXIsICIvIiwgc2FtcGxlW2ldLCAiX0FsdGVyYXRpb25fdHlwZV90aW1lcG9pbnRzX21vbGVjdWxhcl9zdWJ0eXBlX2JhcnBsb3RzX1BMLnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3RfdmFyaWFudF9tb2xlY3VsYXJfc3VidHlwZShkZiA9IGRmX3N1YiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlLCByb3dzID0gcm93c192YWx1ZSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSB3aWR0aF92YWx1ZSwgaGVpZ2h0ID0gNikKcHJpbnQocCkKZGV2Lm9mZigpCn0KCmBgYAoKIyMgUEJUQSBjb2hvcnQKCgpgYGB7ciBwbG90LW1vbGVjdWxhci1zdWJ0eXBlLVBCVEEsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9ClBCVEFfcGFuZWxfZGYgPC0gUEJUQV9jb3VudF9kZiAlPiUgCiAgbXV0YXRlKGNnX2lkID0gc3RyX3JlcGxhY2VfYWxsKGNnX2lkLCAiICIsICJfIiksCiAgICAgICAgIG1vbGVjdWxhcl9zdWJ0eXBlID0gc3RyX3dyYXAobW9sZWN1bGFyX3N1YnR5cGUsIDEyKSkgIyBFZGl0IHRvIGZpdCBpbiB0aGUgcGxvdCB0aXRsZSBmb3IgdGhlIHBhbmVsCgpzYW1wbGUgPC0gYXMuY2hhcmFjdGVyKHVuaXF1ZShQQlRBX3BhbmVsX2RmJGNnX2lkKSkgCnNhbXBsZSA8LSBzb3J0KHNhbXBsZSwgZGVjcmVhc2luZyA9IEZBTFNFKQpzYW1wbGUKCgojIExvb3AgdGhyb3VnaCB2YXJpYWJsZQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNhbXBsZSkpewogIHByaW50KGkpCiAgZGZfc3ViIDwtIFBCVEFfcGFuZWxfZGYgJT4lCiAgICBmaWx0ZXIoY2dfaWQgPT0gc2FtcGxlW2ldKSAlPiUgCiAgICBhcnJhbmdlKGNnX2lkLCBkZXNjKG1vbGVjdWxhcl9zdWJ0eXBlKSwgdHVtb3JfZGVzY3JpcHRvciwgdGRfcGxvdF9ncm91cF9uLCBWYXJpYW50X0NsYXNzaWZpY2F0aW9uKSAKCiAKICAgaWYgKGkgJWluJSBjKDIzLCAyNSwgNDEpKXsKICAgIHdpZHRoX3ZhbHVlID0gMjUKICAgIHJvd3NfdmFsdWUgPC0gMQogICAgaGVpZ2h0X3ZhbHVlID0gNgogICB9ZWxzZSBpZiAoaSAlaW4lIGMoMzgpKXsKICAgIHdpZHRoX3ZhbHVlID0gMjUKICAgIHJvd3NfdmFsdWUgPC0gMgogICAgaGVpZ2h0X3ZhbHVlID0gMTAKICAgIH1lbHNlewogICAgd2lkdGhfdmFsdWUgPSAxMAogICAgcm93c192YWx1ZSA8LSAxCiAgICBoZWlnaHRfdmFsdWUgPSA2CiAgICB9CiAgCiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCnhfdmFsdWUgPC0gZGZfc3ViJHR1bW9yX2Rlc2NyaXB0b3IKdGl0bGUgPC0gcGFzdGUoc2FtcGxlW2ldLCAiVmFyaWFudHMgYWNyb3NzIG1vbGVjdWxhciBzdWJ0eXBlcyIsIHNlcCA9ICI6ICIpCgoKIyBSdW4gZnVuY3Rpb24KZm5hbWUgPC0gcGFzdGUwKG1vbGVjdWxhcl9zdWJ0eXBlX1BCVEFfcGxvdHNfZGlyLCAiLyIsIHNhbXBsZVtpXSwgIl9BbHRlcmF0aW9uX3R5cGVfdGltZXBvaW50c19tb2xlY3VsYXJfc3VidHlwZV9iYXJwbG90c19QQlRBLnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3RfdmFyaWFudF9tb2xlY3VsYXJfc3VidHlwZShkZiA9IGRmX3N1YiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlLCByb3dzID0gcm93c192YWx1ZSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSB3aWR0aF92YWx1ZSwgaGVpZ2h0ID0gaGVpZ2h0X3ZhbHVlKQpwcmludChwKQpkZXYub2ZmKCkKfQoKYGBgCgoKIyBBbHRlcmF0aW9ucyBwZXIgdGltZXBvaW50IGluIGVhY2ggY2FuY2VyIHR5cGUsIG1vbGVjdWxhciwgYW5kIGtpZHNfaWQKCiMjIFBMIGNvaG9ydCB3aXRoIG1vbGVjdWxhciBzdWJ0eXBlCgpgYGB7ciBwbG90LWNnLWlkLW1vbGVjdWxhci1zdWJ0eXBlLWtpZHMtUEwsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLmZ1bGx3aWR0aCA9IFRSVUV9CmNnX2RmIDwtIFBMX2NvdW50X2RmICU+JQogICMgRml4IHN5bnRheCBpbiBjYW5jZXIgZ3JvdXBzIG5hbWVzIAogIG11dGF0ZShjZ19pZCA9IHN0cl9yZXBsYWNlX2FsbChjZ19pZCwgIiAiLCAiXyIpKSAKCnNhbXBsZSA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKGNnX2RmJGNnX2lkKSkgCnNhbXBsZSA8LSBzb3J0KHNhbXBsZSwgZGVjcmVhc2luZyA9IEZBTFNFKQpzYW1wbGUKCgojIExvb3AgdGhyb3VnaCB2YXJpYWJsZQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNhbXBsZSkpewogIHByaW50KGkpCiAgZGZfc3ViIDwtIGNnX2RmICU+JQogICAgZmlsdGVyKGNnX2lkID09IHNhbXBsZVtpXSkgJT4lCiAgICAgbXV0YXRlKHR1bW9yX2Rlc2NyaXB0b3IgPSBmYWN0b3IodHVtb3JfZGVzY3JpcHRvciksCiAgICAgICAgIHR1bW9yX2Rlc2NyaXB0b3IgPSBmY3RfcmVsZXZlbCh0dW1vcl9kZXNjcmlwdG9yLCB0aW1lcG9pbnRzX29yZGVyX2FiYnJldiksCiAgICAgICAgIFZhcmlhbnRfQ2xhc3NpZmljYXRpb24gPSBmYWN0b3IoVmFyaWFudF9DbGFzc2lmaWNhdGlvbiksCiAgICAgICAgIFZhcmlhbnRfQ2xhc3NpZmljYXRpb24gPSBmY3RfcmVsZXZlbChWYXJpYW50X0NsYXNzaWZpY2F0aW9uLCB2YXJpYW50c19vcmRlcikpICU+JSAKICAgIGFycmFuZ2UodHVtb3JfZGVzY3JpcHRvciwgVmFyaWFudF9DbGFzc2lmaWNhdGlvbikKCiAgaWYgKGkgJWluJSBjKDIsIDcsIDE1LCAxOCkpewogICAgd2lkdGhfdmFsdWUgPSAyNQogICAgfWVsc2UgaWYgKGkgJWluJSBjKDEwLCAxNikpewogICAgd2lkdGhfdmFsdWUgPSAzNgogICAgfWVsc2V7CiAgICB3aWR0aF92YWx1ZSA9IDEwCiAgICAgIH0KCiAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICB4X3ZhbHVlIDwtIGRmX3N1YiR0ZF9tc19wbG90X2dyb3VwCiAgdGl0bGUgPC0gcGFzdGUoc2FtcGxlW2ldLCAiVmFyaWFudHMgYWNyb3NzIHNhbXBsZXMiLCBzZXAgPSAiOiAiKQogIHJvd3NfdmFsdWUgPC0gMQogIAogICMgUnVuIGZ1bmN0aW9uCiAgZm5hbWUgPC0gcGFzdGUwKGtpZHNfbW9sZWN1bGFyX3N1YnR5cGVfUExfcGxvdHNfZGlyLCAiLyIsIHNhbXBsZVtpXSwgIl9BbHRlcmF0aW9uX3R5cGVfdGltZXBvaW50c19raWRzX2JhcnBsb3RzX1BMLnBkZiIpCiAgcHJpbnQoZm5hbWUpCiAgcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90X3ZhcmlhbnRfa2lkcyhkZiA9IGRmX3N1YiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlLCByb3dzID0gcm93c192YWx1ZSkKICBwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IHdpZHRoX3ZhbHVlLCBoZWlnaHQgPSA2KQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgfQoKYGBgCgojIyBQTCBjb2hvcnQgd2l0aG91dCBtb2xlY3VsYXIgc3VidHlwZQoKYGBge3IgcGxvdC1jZy1pZC1raWRzLVBMLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYsIGZpZy5mdWxsd2lkdGggPSBUUlVFfQpjZ19kZiA8LSBQTF9jb3VudF9kZiAlPiUKICAjIEZpeCBzeW50YXggaW4gY2FuY2VyIGdyb3VwcyBuYW1lcyAKICBtdXRhdGUoY2dfaWQgPSBzdHJfcmVwbGFjZV9hbGwoY2dfaWQsICIgIiwgIl8iKSkKCnNhbXBsZSA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKGNnX2RmJGNnX2lkKSkgCnNhbXBsZSA8LSBzb3J0KHNhbXBsZSwgZGVjcmVhc2luZyA9IEZBTFNFKQpzYW1wbGUKCgojIExvb3AgdGhyb3VnaCB2YXJpYWJsZQpmb3IgKGkgaW4gc2VxX2Fsb25nKHNhbXBsZSkpewogIHByaW50KGkpCiAgZGZfc3ViIDwtIGNnX2RmICU+JQogICAgZmlsdGVyKGNnX2lkID09IHNhbXBsZVtpXSkgCgogIGlmIChpICVpbiUgYygyLCA3LCAxNSwgMTgpKXsKICAgIHdpZHRoX3ZhbHVlID0gMjUKICAgIH1lbHNlIGlmIChpICVpbiUgYygxMCwgMTYpKXsKICAgIHdpZHRoX3ZhbHVlID0gMjgKICAgIH1lbHNlewogICAgd2lkdGhfdmFsdWUgPSAxMAogICAgICB9CgogICMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCiAgeF92YWx1ZSA8LSBkZl9zdWIkdGRfbXNfcGxvdF9ncm91cF9uCiAgdGl0bGUgPC0gcGFzdGUoc2FtcGxlW2ldLCAiVmFyaWFudHMgYWNyb3NzIHNhbXBsZXMiLCBzZXAgPSAiOiAiKQogIHJvd3MgPC0gMQogIAogICMgUnVuIGZ1bmN0aW9uCiAgZm5hbWUgPC0gcGFzdGUwKGtpZHNfUExfcGxvdHNfZGlyLCAiLyIsIHNhbXBsZVtpXSwgIl9BbHRlcmF0aW9uX3R5cGVfdGltZXBvaW50c19raWRzX2JhcnBsb3RzX1BMLnBkZiIpCiAgcHJpbnQoZm5hbWUpCiAgcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90X3ZhcmlhbnRfa2lkcyhkZiA9IGRmX3N1YiwgeCA9IHhfdmFsdWUsIHBhbGV0dGUgPSBwYWxldHRlLCB0aXRsZSA9IHRpdGxlLCByb3dzID0gcm93cykKICBwZGYoZmlsZSA9IGZuYW1lLCB3aWR0aCA9IHdpZHRoX3ZhbHVlLCBoZWlnaHQgPSA2KQogIHByaW50KHApCiAgZGV2Lm9mZigpCiAgfQoKYGBgCgpgYGB7ciBlY2hvPVRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCg==